home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1997 April / macformat-049.iso / mac / Shareware Plus / Sound / DSM Player 1.0 / DSM API 1.04 / iostream.h < prev    next >
Encoding:
C/C++ Source or Header  |  1996-12-29  |  5.5 KB  |  282 lines  |  [TEXT/CWIE]

  1. /*
  2. **  File:             iostream.h
  3. **  Description:    buffered iostream class declarations
  4. **
  5. **    Digital Sound Machine v1.0
  6. **         © 1996 Dmitry Boldyrev
  7. **
  8. */
  9.  
  10. #pragma once
  11.  
  12. #define    BIG_ENDIAN
  13.  
  14. typedef char            byte;            //    8-bit signed
  15. typedef unsigned char    ubyte;            //    8-bit unsigned
  16. typedef short            word;            // 16-bit signed
  17. typedef unsigned short    uword;            // 16-bit unsigned
  18. typedef unsigned long    ulong;            // 32-bit unsigned
  19. typedef unsigned char    bool;            // boolean type (true/false)
  20. typedef word             error;            // error code (Mac compatible)
  21.  
  22. //    I/O Stream API (pure virtual)
  23.  
  24. class ios
  25. {
  26.     public:
  27.     
  28.         virtual        ~ios() {}
  29.     
  30.         typedef enum {
  31.             set     = 0,                //    offset from start of file
  32.             cur     = 1,                //    offset from current position
  33.             end     = 2                    //    offset from end of file
  34.         } ioPos;
  35.         
  36.         typedef enum {
  37.             read    = 0,                //    open file to read
  38.             write    = 1                    //    open file to write
  39.         } ioMode;
  40.         
  41.         // -------------------------------------------------------------------------
  42.  
  43.         virtual byte    fgetc() = 0;
  44.         virtual byte    fputc(byte c) = 0;
  45.  
  46.         virtual long    fread(void *p, long size, long count) = 0;
  47.         virtual long    fwrite(void *p, long size, long count) = 0;
  48.     
  49.         virtual error    feof() const = 0;
  50.     
  51.         virtual long    ftell() = 0;
  52.         virtual error    fseek(long offset, ioPos whence) = 0;
  53.  
  54.         virtual error    fflush() = 0;
  55.  
  56.         // -------------------------------------------------------------------------
  57.  
  58.         inline ubyte    fgetb();        //    motorolla/intel byte
  59.  
  60.         inline uword    fgetmw();        //    motorolla word
  61.         inline uword    fgetiw();        //    intel word
  62.  
  63.         inline ulong    fgetml();        //    motorolla long
  64.         inline ulong    fgetil();        //    intel long
  65.  
  66.         inline long        freadi(void *p, long size, long count);
  67.         inline long        freadm(void *p, long size, long count);
  68.  
  69.         // -------------------------------------------------------------------------
  70.  
  71.         inline void        fputb(byte b);    //    motorolla/intel byte
  72.     
  73.         inline void        fputmw(word w);    //    motorolla word
  74.         inline void        fputiw(word w);    //    intel word
  75.  
  76.         inline void        fputml(long l);    //    motorolla long
  77.         inline void        fputil(long l);    //    intel long
  78.  
  79.         inline error    ferror(void) const;    //    returns the result of previous io operation
  80.         
  81.     protected:
  82.  
  83.         error            err : 1;
  84.  
  85. };
  86.  
  87. //    Memory stream
  88.  
  89. class mstream : public ios
  90. {
  91.     public:
  92.  
  93.                         mstream();
  94.                         mstream(Ptr base, long length, ioMode mode);
  95.         virtual           ~mstream();
  96.  
  97.         virtual byte    fgetc();
  98.         virtual byte    fputc(byte c);
  99.  
  100.         virtual long    fread(void *p, long size, long count);
  101.         virtual long    fwrite(void *p, long size, long count);
  102.     
  103.         virtual error    feof() const;
  104.     
  105.         virtual long    ftell();
  106.         virtual error    fseek(long offset, ioPos whence);
  107.     
  108.         virtual error    fflush();
  109.     
  110.     protected:
  111.     
  112.         Ptr                hBase;
  113.         Ptr                hPos;
  114.         
  115.         long            len;
  116.     
  117. };
  118.  
  119. //    Resource stream
  120.  
  121. class rstream : public mstream
  122. {
  123.     public:
  124.  
  125.                         rstream(ResType rType, short rID, ioMode mode);                
  126.     virtual               ~rstream();
  127.  
  128.     protected:    
  129.     
  130.         Handle            hRsrc;
  131. };
  132.  
  133.  
  134. //    File stream
  135.  
  136. class fstream : public ios
  137. {
  138.     public:
  139.     
  140.                         fstream(const Str255 fName, short vRefNum, ioMode mode);
  141.                         fstream(const FSSpec &inSpec, ioMode mode);
  142.                         fstream(const SFReply &inReply, ioMode mode);
  143.                         
  144.         virtual           ~fstream();
  145.  
  146.         virtual byte    fgetc();
  147.         virtual byte    fputc(byte c);
  148.  
  149.         virtual long    fread(void *p, long size, long count);
  150.         virtual long    fwrite(void *p, long size, long count);
  151.     
  152.         virtual error    feof() const;
  153.     
  154.         virtual long    ftell();
  155.         virtual error    fseek(long offset, ioPos whence);
  156.  
  157.         virtual error    fflush();
  158.     
  159.     protected:
  160.  
  161.         enum {
  162.             IO_BUFSIZE    = 512,
  163.             IO_EOF         = -1
  164.         };
  165.         
  166.         void            Init();
  167.  
  168.         byte            __read();
  169.         byte            __write();
  170.         void            __buffer();
  171.         void            __reset();
  172.         
  173.         unsigned char*    ptr;            //    buffer incremental pointer
  174.         char*            buf;            //    buffer mem location
  175.         long            size;            //    buffer size
  176.         
  177.         long            cnt;            //    increment count
  178.         long            pos;            //    position in a file
  179.         long            len;            //    length of a file
  180.         
  181.         unsigned        pushed : 1;        //    buffer pushed flag
  182.         unsigned        eof : 1;        //    end of file flag
  183.     
  184.         short            refnum;            //    file reference number
  185. };
  186.  
  187. inline error ios::ferror(void) const
  188. {
  189.     return err;
  190. }
  191.  
  192. inline error fstream::feof() const
  193. {
  194.     return eof;
  195. }
  196. inline ubyte ios::fgetb()
  197. {
  198.     return fgetc();
  199. }
  200. inline uword ios::fgetiw()
  201. {
  202.     return (((uword)fgetb())<<8)|((uword)fgetb());
  203. }
  204. inline uword ios::fgetmw()
  205. {
  206.     return ((uword)fgetb())|(((uword)fgetb())<<8);
  207. }
  208. inline ulong ios::fgetml()
  209. {
  210.     return ((ulong)fgetmw())|(((ulong)fgetmw())<<16);
  211. }
  212. inline ulong ios::fgetil()
  213. {
  214.     return (((ulong)fgetiw())<<16)|((ulong)fgetiw());
  215. }
  216. inline void ios::fputb(byte b)
  217. {
  218.     fputc(b);
  219. }
  220. inline void ios::fputmw(word w)
  221. {
  222.     fputb(w&0xff); fputb(w>>8); 
  223. }
  224. inline void ios::fputiw(word w)
  225. {
  226.     fputb(w>>8); fputb(w&0xff); 
  227. }
  228. inline void ios::fputml(long l)
  229. {
  230.     fputmw(l&0xffff); fputmw(l>>16); 
  231. }
  232. inline void ios::fputil(long l)
  233. {
  234.     fputiw(l>>16); fputiw(l&0xffff); 
  235. }
  236. #define    FLIP16(a)     ((a)=(a>>8)&0xff|(a<<8))
  237. #define    FLIP32(a)    ((a)=((a&0xFF000000)>>24)|((a&0x00FF0000)>>8)| \
  238.                      ((a&0x0000FF00)<<8)|(a<<24))
  239.  
  240. inline long    ios::freadi(void *p, long size, long count)
  241. {
  242.     long result = fread(p, size, count);
  243. #ifdef BIG_ENDIAN
  244.     switch (size) 
  245.     {
  246.         case 2:
  247.             word *wptr = (word*) p;
  248.             for(; count>0; count--, wptr++)
  249.                 FLIP16(*wptr);
  250.             break;
  251.         case 4:
  252.             long *lptr = (long*) p;
  253.             for(; count>0; count--, lptr++)
  254.                 FLIP32(*lptr);
  255.             break;
  256.     }
  257. #endif
  258.     return result;
  259. }
  260. inline long ios::freadm(void *p, long size, long count)
  261. {
  262.     long result = fread(p, size, count);
  263. #ifndef BIG_ENDIAN
  264.     switch (size) 
  265.     {
  266.         case 2:
  267.             word *wptr = (word*) p;
  268.             for(; count>0; count--, wptr++)
  269.                 FLIP16(*wptr);
  270.             break;
  271.         case 4:
  272.             long *lptr = (long*) p;
  273.             for(; count>0; count--, lptr++)
  274.                 FLIP32(*lptr);
  275.             break;
  276.     }
  277. #endif
  278.     return result;
  279. }
  280.  
  281.  
  282.